package Day_0228.DeadLock;

/**
 * @author zxc
 * @date 2023/02/28 22:11
 **/
public class DeadLock {
    public static void main(String[] args) {
        /**
         * 谈一谈对于死锁的理解
         * ===》
         * 一，死锁产生的4个必要条件
         * ===》
         * 产生死锁的必要条件：
         * 1. 互斥条件 ：
         * ===》
         * 进程要求对所分配的资源进行排它性控制，即在一段时间内某资源仅为一进程所占用。
         *
         * 2. 请求和保持条件 ：
         * ===》
         * 当进程因请求资源而阻塞时，对已获得的资源保持不放。
         *
         * 3. 不剥夺条件 ：
         * ===》
         * 进程已获得的资源在未使用完之前，不能剥夺，只能在使用完时由自己释放。
         *
         * 4. 环路等待条件（循环等待条件） ：
         * ===》
         * 在发生死锁时，必然存在一个进程--资源的环形链。
         *
         * 二，解决死锁的基本方法
         * 1.预防死锁：
         * （1）资源一次性分配 ：
         *  ===》
         *  一次性分配所有资源，这样就不会再有请求了：（破坏请求条件）
         *
         * （2）只要有一个资源得不到分配，也不给这个进程分配其他的资源：（破坏请保持条件）
         *
         * （3）可剥夺资源 ：
         *  ===》
         *  即，当某进程获得了部分资源，但得不到其它资源，则释放已占有的资源（破坏不可剥夺条件）
         *
         * （4）资源有序分配法 ：
         *  ===》
         *  系统给每类资源赋予一个编号，每一个进程按编号递增的顺序请求资源，释放则相反（破坏环路等待条件）
         *  1.以确定的顺序来获取锁，来保证不会出现死锁的情况;
         *  2.超时放弃 ：即，设置固定的时长去等待锁，若是在该固定时长中未能够等待到所要资源，则会把之前所获取的所有资源;
         *
         *
         *  二、死锁与饥饿
         * （1）饥饿（Starvation）：
         *  ===》
         *  指一个进程一直得不到资源。
         * （2）死锁和饥饿都是由于进程竞争资源而引起的。
         * （3）饥饿一般不占有资源，死锁进程一定占有资源。
         *
         * 三、资源的类型
         * 可重用资源和消耗性资源
         * 1.可重用资源（永久性资源）
         * （1）可被多个进程多次使用，如所有硬件。
         * （2）只能分配给一个进程使用，不允许多个进程共享。
         * （3）进程在对可重用资源的使用时，须按照请求资源、使用资源、释放资源这样的顺序。
         * （4）系统中每一类可重用资源中的单元数目是相对固定的，进程在运行期间，既不能创建，也不能删除。
         * ===》
         * 即，在同一时间端，有其仅有一个线程能够对于可重用资源进行操作，同时该可重用资源中所有数据都是共享的;
         *
         * 2.消耗性资源（临时性资源）
         * （1）又称临时性资源，是由进程在运行期间动态的创建和消耗的。
         * （2）消耗性资源在进程运行期间是可以不断变化的，有时可能为0。
         * （3）进程在运行过程中，可以不断地创造可消耗性资源的单元，将它们放入该资源类的缓冲区中，以增加该资源类的单元数目。
         * （4）进程在运行过程中，可以请求若干个可消耗性资源单元，用于进程自己消耗，不再将它们返回给该资源类中。
         * （5）可消耗资源通常是由生产者进程创建，由消费者进程消耗。
         * 最典型的可消耗资源是用于进程间通信的消息。
         *
         * 可抢占资源和不可抢占资源
         * 3.可抢占资源
         * （1）可抢占资源指某进程在获得这类资源后，该资源可以再被其他进程或系统抢占。
         *  对于这类资源是不会引起死锁的。
         * （2）CPU 和主存均属于可抢占性资源。
         * 4.不可抢占资源
         * （1）一旦系统把某资源分配给该进程后，就不能将它强行收回，只能在进程用完后自行释放。
         * （2）磁带机、打印机等属于不可抢占性资源。
         *
         * 四，死锁产生的原因
         * 1.竞争不可抢占资源引起死锁
         * ===》
         * （1）通常系统中拥有的不可抢占资源，其数量不足以满足多个进程运行的需要，
         * （2）使得进程在运行过程中，会因争夺资源而陷入僵局，
         *  如磁带机、打印机等。只有对不可抢占资源的竞争 才可能产生死锁，
         * （3）对可抢占资源的竞争是不会引起死锁的。
         *
         * 2.竞争可消耗资源引起死锁
         *
         * 3.进程推进顺序不当引起死锁
         * ===》
         * （1）进程在运行过程中，请求和释放资源的顺序不当，也同样会导致死锁。
         *  例如，并发进程 P1、P2分别保持了资源R1、R2，而进程P1申请资源R2，进程P2申请资源R1时，
         *  两者都会因为所需资源被占用而阻塞。
         *
         * （2）信号量使用不当也会造成死锁。
         *  进程间彼此相互等待对方发来的消息，结果也会使得这 些进程间无法继续向前推进。
         *  例如，进程A等待进程B发的消息，进程B又在等待进程A 发的消息，
         *  可以看出进程A和B不是因为竞争同一资源，而是在等待对方的资源导致死锁。
         *
         * 五，处理死锁的方法
         * ===》即，破坏死锁产生的四个必要条件中某个条件，使得其构不成死锁;
         * 1. 破坏“互斥”条件:
         * （1）就是在系统里取消互斥。若资源不被一个进程独占使用，那么死锁是肯定不会发生的;
         * （2）一般来说在所列的四个条件中，“互斥”条件是无法破坏的;
         * （3）由于互斥条件，是锁所具有基本特征;
         *  ===》
         *  因此，在死锁预防里主要是破坏其他几个必要条件，而不去涉及破坏“互斥”条件。
         *
         * 2. 破坏“占有并等待”条件:
         * （1）破坏“占有并等待”条件，就是在系统中不允许进程在已获得某种资源的情况下，申请其他资源。
         *  即，要想出一个办法，阻止进程在持有资源的同时申请其他资源。
         * （2）一次性申请当前线程所需要的全部资源 ：
         *  创建进程时，要求它申请所需的全部资源，系统或满足其所有要求，或什么也不给它。
         *  ===》
         *  这是所谓的 “ 一次性分配”方案。
         *
         * （2）申请资源之前，释放本身已经占有的所有资源
         *  ===》
         *  要求每个进程提出新的资源申请前，释放它所占有的资源。
         *  一个进程在需要资源S时，须先把它先前占有的资源R释放掉，然后才能提出对S的申请，即使它可能很快又要用到资源R。
         *
         * 3.破坏“不可抢占”条件 ：
         * ===》
         * 破坏“不可抢占”条件就是允许对资源实行抢夺。
         * （1）未能获取到所需要资源，即需要释放自身已经占有的资源
         *  ===》
         *  如果占有某些资源的一个进程，进行进一步资源请求被拒绝，
         *  则该进程必须释放它最初占有的资源，如果有必要，可再次请求这些资源和另外的资源。
         *
         * （2）抢占另一个进程已经获取的资源 ：
         *  ===》
         *  如果一个进程请求当前被另一个进程占有的一个资源，则操作系统可以抢占另一个进程，要求它释放资源。
         *  只有在任意两个进程的优先级都不相同的条件下，方法二才能预防死锁。
         *
         * 4. 破坏“循环等待”条件 ：
         * ===》
         * 破坏“循环等待”条件的一种方法，是将系统中的所有资源统一编号，进程可在任何时刻提出资源申请，
         * 但所有申请必须按照资源的编号顺序（升序）提出。这样做就能保证系统不出现死锁。
         *
         * 六，解除死锁
         * ===》
         * 一旦检测出死锁，就应立即釆取相应的措施，以解除死锁。
         * 死锁解除的主要方法有：
         * 1.资源剥夺法。
         * ===》
         * （1）挂起某些死锁进程，并抢占它的资源，将这些资源分配给其他的死锁进程。
         * （2）但应防止被挂起的进程长时间得不到资源，而处于资源匮乏的状态。
         * ===》
         * 总结 ：
         * 即，选择去挂起部分死锁线程，同时将这部分线程所占有的资源进行释放;
         *
         * 2.撤销进程法。
         * （1）强制撤销部分、甚至全部死锁进程并剥夺这些进程的资源。
         * （2）撤销的原则可以按进程优先级和撤销进程代价的高低进行。
         * ===>
         * 总结 ：
         * 即，按照进程优先级 && 撤销进程代价，来销毁部分/全部死锁线程 && 释放资源;
         *
         * 3.进程回退法。
         * （1）让一（多）个进程回退到足以回避死锁的地步，进程回退时,自愿释放资源而不是被剥夺。
         * （2）要求系统保持进程的历史信息，设置还原点。
         * ===>
         * 总结 ：
         * 即，使用快照（snapshot）来记录所有进程的历史状态，若是出现死锁的话，则选择直接回退至历史版本状态;
         *
         *
         */
    }
}
